正则表达式是什么呢?正则表达式怎么用?

您所在的位置:网站首页 正则表达式/是什么意思 正则表达式是什么呢?正则表达式怎么用?

正则表达式是什么呢?正则表达式怎么用?

2022-08-13 19:54| 来源: 网络整理| 查看: 265

一、什么是正则表达式 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。 注意:正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述二、普通字符大多数的字符仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字。也就是说普通字符只能够匹配字符串中与它们相同的字符。

三:常用的元字符由于普通字符只能匹配与自身相同的字符,那么正则表达式的灵活性和强大的匹配功能就不能完全展现,于是正则表达式中规定了一系列的特殊字符,这些字符不是按照字符的直接量进行匹配的,而是具有特殊的语义,

代码说明.匹配除换行符以外的任意字符\w匹配字母或数字或下划线或汉字\s匹配任意的空白符\d匹配数字\b匹配单词的开始或结束^匹配字符串的开始$匹配字符串的结束

虽然说上面的字符具有特殊含义,但是一些字符只有在某些上下文环境中才具有特殊的含义。由于它们是构造各种匹配复杂文本的正则表达式的基本字符,所以被称作元字符

\b ^ $的区别\b一般指单词边界(空格、空行、标点、tab、行首字、行尾等都算),如“a java program”中java两边都是空格,就可以匹配上。^ $是字符串的首尾,一般一行是一个字符串的话,就是行首 行尾比如用\bjava\b和^java$的两个正则尝试匹配字符串java is the best language in the world的话, \bjava\b 可以匹配到 java, 而 ^java$ 则无法匹配成功

四:转义字符 \如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\.例如:deerchao\.net匹配deerchao.net,C:\\Windows匹配C:\Windows。五:重复匹配定符,指定数量的代码

代码/语法说明*重复零次或更多次+重复一次或更多次?重复零次或一次{n}重复n次{n,}重复n次或更多次{n,m}重复n到m次

Windows\d+匹配Windows后面跟1个或更多数字^\w+匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)

六:字符类匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u), 只需要在方括号里列出它们就行了 例:[aeiou]就匹配任何一个英文元音字母 [.?!]匹配标点符号(.或?或!)[0-9]代表的含意与\d就是完全一致的:一位数字;[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)。

七:分枝条件 | 用|把不同的规则分隔开,相当于或的关系例:\d{5}-\d{4}|\d{5} :这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。

八:反义有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字字符都行的情况,这时需要用到反义:

代码/语法说明\W匹配任意不是字母,数字,下划线,汉字的字符\S匹配任意不是空白符的字符\D匹配任意非数字的字符\B匹配不是单词开头或结束的位置[^x]匹配除了x以外的任意字符[^aeiou]匹配除了aeiou这几个字母以外的任意字符

例子:\S+匹配不包含空白符的字符串。]+>匹配用尖括号括起来的以a开头的字符串。 九:分组但如果想要重复多个字符又该怎么办?你可以用小括号来指定分组(子表达式),然后你就可以指定这个子表达式的重复次数了例:(\d{1,3}\.){3}\d{1,3} 要理解这个表达式,请按下列顺序分析它: \d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。如:192.168.123.222使用小括号的时候,还有很多特定用途的语法。下面列出了最常用的一些:

分类代码/语法说明捕获(exp)匹配exp,并捕获文本到自动命名的组里(?exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号零宽断言(?=exp)匹配exp前面的位置(?匹配前面不是exp的位置注释(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读十:后项引用

后向引用用于重复搜索前面某个分组(子表达式)匹配的文本。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。例:\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先匹配一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字 \b(\w+)\b,这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。 注意:

分组0对应整个正则表达式实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组号你可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权.

你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?\w+)(或者把尖括号换成'也行:(?'Word'\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k.所以上一个例子也可以写成这样:

\b(?\w+)\b\s+\k\b。

十一:什么是断言用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),十二:零宽断言零宽度正预测先行断言(?=exp) 断言自身出现的位置的后面能匹配表达式exp例:

\b\w+(?=ing\b)

匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing.时,它会匹配sing和danc。

零宽度正回顾后发断言(?例如:

(?

匹配前面不是小写字母的七位数字。

复杂例子

(?


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3